Mock
Mock private variable
Exemple: la classe MainQueryBuilder contient une variable privée $mainBuilder de type BaseBuilder.
On veut tester la méthode getMainBuilderCompiledSelect qui retourne la valeur de la méthode getCompiledSelect de l'objet $mainBuilder.
Mock standard
Exemple : ceci est la méthode à tester de la classe MainQueryBuilder
public function getMainBuilderCompiledSelect(): string
{
return $this->mainBuilder->getCompiledSelect(false);
}
On va mocker la classe MainQueryBuilder pour pouvoir tester la méthode getMainBuilderCompiledSelect.
// on instancie la classe MainQueryBuilder
$queryBuilder = new MainQueryBuilder($tableName, $select, $where, $orderBy, self::$myDb, 'en');
// Mock the getCompiledSelect method
$mockBuilder = $this->createMock(BaseBuilder::class);
$mockBuilder->expects($this->once()) // we expect the method to be called once
->method('getCompiledSelect') // the method to be called
->with(false) // the parameter to be passed
->willReturn('compiledSelect'); // the value to be returned
// Set the mock object using reflection
$reflection = new \ReflectionClass($queryBuilder); // get the reflection of the object
$property = $reflection->getProperty('mainBuilder'); // get the property
$property->setAccessible(true); // set the property accessible
$property->setValue($queryBuilder, $mockBuilder); // set the value of the property
// Call the method to test
$result = $queryBuilder->getBuilderCompiledSelect();
// Check the result
$this->assertSame('compiledSelect', $result);
Mock with CodeIngiter
CodeIgniter permet de facilement modifier une variable private d'une classe. Pour une valeur simple c'est facile, mais pour un objet que lôn souhaite également redéfinir ces méthodes, il vaut mieux utiliser l'exemple ci-dessus.
// Create an instance of the class to test
$obj = new MainQueryBuilder(...);
// Set the value
$this->setPrivateProperty($obj, 'maSimpleVariableString', 'myVStringValue');
Live Template raccourci :
prvprop
Mock private method
Mock private methode pass arg by reference
Lorsque l'argument est passé par référence on doit utiliser le code ci-dessous. (CodeIgniter ne permet pas ces tests).
$attributesInfo = new AttributesInfo(self::$myDb);
$mockBb = $this->createMock(BaseBuilder::class);
$mockBb->method('get')->willReturn('ma string');
$arguments = [&$mockBb];
$rc = new ReflectionMethod('Lepag\QueryDtoBuilder\QueryInfos\AttributesInfo', 'getQuery');
$rc->invokeArgs($attributesInfo, $arguments);